package sui.utils.convert;

import java.math.BigDecimal;
import java.math.BigInteger;

import org.apache.commons.lang3.StringUtils;

/**
 * <p>
 * Description: 数据转换类
 * <p>
 * 
 * @author XQF SUI
 * @Created: 2016年11月23日 下午7:57:27
 * @version 1.0
 */
public class ConvertUtils {

	public static final int[] IA = new int[256];

	/**
	 * 
	 * <p>
	 * Desc：将对象转换为String类型
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created 2016年11月23日 下午7:57:20
	 * @param o
	 * @return
	 */
	public static String convertToString(Object o) {

		if (o == null) {
			return null;
		}

		return StringUtils.isBlank(o.toString()) ? null : o.toString();
	}

	/**
	 * <p>
	 * Desc：将对象转换为int类型
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created 2016年11月23日 下午8:07:07
	 * @param o
	 * @return
	 */
	public static int convertToInt(Object o) {

		if (o == null) {
			return 0;
		}

		return convertToInteger(o).intValue();
	}

	/**
	 * <p>
	 * Desc：将对象转换为Integer类型
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created 2016年11月23日 下午8:07:07
	 * @param o
	 * @return
	 */
	public static Integer convertToInteger(Object o) {
		if (o == null) {
			return null;
		}

		if (o instanceof Integer) {
			return (Integer) o;
		}

		if (o instanceof Number) {
			return ((Number) o).intValue();
		}

		if (o instanceof String) {
			String strVal = (String) o;

			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			if (strVal.indexOf(',') != 0) {
				strVal = strVal.replaceAll(",", "");
			}

			return Integer.parseInt(strVal);
		}

		if (o instanceof Boolean) {
			return ((Boolean) o).booleanValue() ? 1 : 0;
		}

		throw new RuntimeException("Cannot be converted to Integer type data, Object : " + o);
	}

	/**
	 * <p>
	 * Description：将对象转换为BigDecimal类型
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created 2016年11月23日 下午8:16:03
	 * @param o
	 * @return
	 */
	public static BigDecimal convertToBigDecimal(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof BigDecimal) {
			return (BigDecimal) o;
		}

		if (o instanceof BigInteger) {
			return new BigDecimal((BigInteger) o);
		}

		String strVal = o.toString();
		if (strVal.length() == 0) {
			return null;
		}

		return new BigDecimal(strVal);
	}

	/**
	 * <p>
	 * Desc：将对象转换为BigInteger类型
	 * </p>
	 * 
	 * @author XQF SUI
	 * @created 2016年11月23日 下午8:23:20
	 * @param o
	 * @return
	 */
	public static BigInteger convertToBigInteger(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof BigInteger) {
			return (BigInteger) o;
		}

		if (o instanceof Float || o instanceof Double) {
			return BigInteger.valueOf(((Number) o).longValue());
		}

		String strVal = o.toString();
		if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
			return null;
		}

		return new BigInteger(strVal);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为Boolean类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:05:13
	 * @param o
	 * @return
	 */
	public static Boolean convertToBoolean(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof Boolean) {
			return (Boolean) o;
		}

		if (o instanceof Number) {
			return ((Number) o).intValue() == 1;
		}

		if (o instanceof String) {
			String strVal = (String) o;

			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			if ("true".equalsIgnoreCase(strVal) || "1".equals(strVal)) {
				return Boolean.TRUE;
			}

			if ("false".equalsIgnoreCase(strVal) || "0".equals(strVal)) {
				return Boolean.FALSE;
			}
		}

		throw new RuntimeException("Cannot be converted to Integer type data, Object : " + o);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为Byte类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:05:35
	 * @param o
	 * @return
	 */
	public static Byte convertToByte(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof Number) {
			return ((Number) o).byteValue();
		}

		if (o instanceof String) {
			String strVal = (String) o;
			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			return Byte.parseByte(strVal);
		}

		throw new RuntimeException("Cannot be converted to Byte type data, Object : " + o);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为byte[]类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:05:47
	 * @param o
	 * @return
	 */
	public static byte[] convertToBytes(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof byte[]) {
			return (byte[]) o;
		}

		if (o instanceof String) {

			String str = (String) o;
			int strLength = str.length();

			if (str.length() == 0) {
				return new byte[0];
			}

			int sIx = 0, eIx = str.length() - 1;

			while (sIx < eIx && IA[str.charAt(sIx) & 0xff] < 0)
				sIx++;

			while (eIx > 0 && IA[str.charAt(eIx) & 0xff] < 0)
				eIx--;

			int pad = str.charAt(eIx) == '=' ? (str.charAt(eIx - 1) == '=' ? 2 : 1) : 0;
			int cCnt = eIx - sIx + 1;
			int sepCnt = strLength > 76 ? (str.charAt(76) == '\r' ? cCnt / 78 : 0) << 1 : 0;

			int len = ((cCnt - sepCnt) * 6 >> 3) - pad;
			byte[] dArr = new byte[len];

			int d = 0;
			for (int cc = 0, eLen = (len / 3) * 3; d < eLen;) {
				int i = IA[str.charAt(sIx++)] << 18 | IA[str.charAt(sIx++)] << 12 | IA[str.charAt(sIx++)] << 6
						| IA[str.charAt(sIx++)];

				dArr[d++] = (byte) (i >> 16);
				dArr[d++] = (byte) (i >> 8);
				dArr[d++] = (byte) i;

				if (sepCnt > 0 && ++cc == 19) {
					sIx += 2;
					cc = 0;
				}
			}

			if (d < len) {
				int i = 0;
				for (int j = 0; sIx <= eIx - pad; j++) {
					i |= IA[str.charAt(sIx++)] << (18 - j * 6);
				}

				for (int r = 16; d < len; r -= 8) {
					dArr[d++] = (byte) (i >> r);
				}
			}

			return dArr;
		}

		throw new RuntimeException("Cannot be converted to byte[] type data, Object : " + o);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为Double类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:06:16
	 * @param o
	 * @return
	 */
	public static Double convertToDouble(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof Number) {
			return ((Number) o).doubleValue();
		}

		if (o instanceof String) {
			String strVal = o.toString();

			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			if (strVal.indexOf(',') != 0) {
				strVal = strVal.replaceAll(",", "");
			}

			return Double.parseDouble(strVal);
		}

		throw new RuntimeException("Cannot be converted to Double type data, Object : " + o);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为Float类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:06:31
	 * @param o
	 * @return
	 */
	public static Float convertToFloat(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof Number) {
			return ((Number) o).floatValue();
		}

		if (o instanceof String) {
			String strVal = o.toString();
			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			if (strVal.indexOf(',') != 0) {
				strVal = strVal.replaceAll(",", "");
			}

			return Float.parseFloat(strVal);
		}

		throw new RuntimeException("Cannot be converted to Float type data, Object : " + o);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为Long类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:06:43
	 * @param o
	 * @return
	 */
	public static Long convertToLong(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof Number) {
			return ((Number) o).longValue();
		}

		if (o instanceof String) {
			String strVal = (String) o;
			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			if (strVal.indexOf(',') != 0) {
				strVal = strVal.replaceAll(",", "");
			}

			try {
				return Long.parseLong(strVal);
			} catch (NumberFormatException ex) {
				throw new RuntimeException("Failed to convert to Long type data, Object : " + o);
			}
		}

		throw new RuntimeException("Cannot be converted to Long type data, Object : " + o);
	}

	/**
	 * <p>
	 * Desc: 将对象转换为Long类型
	 * </p>
	 * @author XQF SUI
	 * @date 2016年11月23日 下午11:07:12
	 * @param o
	 * @return
	 */
	public static Short convertToShort(Object o) {

		if (o == null) {
			return null;
		}

		if (o instanceof Number) {
			return ((Number) o).shortValue();
		}

		if (o instanceof String) {
			String strVal = (String) o;

			if (strVal.length() == 0 || "null".equals(strVal) || "NULL".equals(strVal)) {
				return null;
			}

			return Short.parseShort(strVal);
		}

		throw new RuntimeException("Cannot be converted to Short type data, Object : " + o);
	}
}
